# -*- coding: utf-8 -*-
# @Time     : 2021/12/6 22:00
# @Author   : wljess
# @File     : __getitem__.py
# @Describe : 
# @Software : PyCharm

class Library(object):
    def __init__(self):
        self.books = [1, 2, 3, 4, 5, 6]
        self.index = -1

    def __getitem__(self, i):
        return self.books[i]


l = Library()
"""
如果在类中定义了__getitem__()方法，那么他的实例对象（假设为P）就可以这样P[key]取值。
当实例对象做P[key]运算时，就会调用类中的__getitem__()方法
"""
print("实现索引取值：", l[2])
print("实现切片：", l[0:2])
print(type(l))

# __getitem__ 可以让对象实现迭代功能，这样就可以使用for...in... 来迭代该对象了
"""
在用 for..in.. 迭代对象时，如果对象没有实现 __iter__ __next__ 迭代器协议，
Python的解释器就会去寻找__getitem__ 来迭代对象，如果连__getitem__ 都没有定义，
这解释器就会报对象不是迭代器的错误
"""
for i in l:
    print(i)


class Taget:
    def __init__(self, id):
        self.id = id

    def __getitem__(self, item):
        print('这个方法被调用')
        return self.id


a = Taget('This is id')
print(a.id)
print(a['python'])


class STgetitem:

    def __init__(self, text):
        self.text = text

    def __getitem__(self, index):
        return self.text[index].upper()


p = STgetitem("黄哥Python")
print(p[4])
print(p[3:])
print("------------------------")
for char in p:
    print(char)


class DataBase:
    '''Python 3 中的类'''

    def __init__(self, id, address):
        '''初始化方法'''
        self.id = id
        self.address = address

    def __getitem__(self, key):
        return self.__dict__.get(key, "100")


data = DataBase(1, "192.168.2.11")
print(data["hi"])
print(data["id"])